<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
<script>

  const event = (function(){
     eventObjs = {
    };

    return {
      // 添加事件
      on:function(type,handler){
        (eventObjs[type] || (eventObjs[type]=[] ) ).push(handler)
      },
      // 移出事件
      off:function(type,handler){
        // 移出所有事件
        if(arguments.length ===0){
          eventObjs = {}
        // 移出事件名下的所有事件
        } else if(arguments.length ===1){
          eventObjs[type] = []
        // 移出事件名下的特定事件
        }else if(arguments.length ===2){
          let _eventList = eventObjs[type]
          if( !_eventList)return;
          // 倒着循环序号不受影响 如果正序 1 ， 2 ， 3 ： a ，4： a ， 5： a  第3个找到 a 把3 删了 数组就成了 3： a , 4:a  ；然后i 成了4 第三个a:3 删除不了
          for(let i = _eventList.length-1 ; i>=0;i--){
            if (_eventList[i] === handler) {
             _eventList.splice(i,1)
            }
          }
        }
      },
      // 触发事件
      emit:function(type){
        //arguments 不是数组而是类数组 所以用call 调用数组slice
        let args = Array.prototype.slice.call(arguments,1) // 从1 开始的参数返回数组
        const  _event = eventObjs[type]
        if(!_event) return;

        for(let i = 0;i < _event.length ;i++){
          // 如果要绑定上下文要用call apply
          _event[i].apply(null,args)
        }
      }

    }
  }())
</script>
</html>